<?php
  /**
  *  hệ thống chống DOS 
  *  rules:
  * 	Chặn session: 30 requests / 15 seconds
  * 	Thời gian chặn session: 30 seconds
  * 	Ban Ip : 60 requests/ 15s
  * 	Thời gian banned IP: 600s 
  */
  // Thư mục đặc biệt chứa các ip được phép truy suất không hạn chế và các ip bị banned
  $allowed_ip = 'ip_dos'.DIRECTORY_SEPARATOR.'allowed'.DIRECTORY_SEPARATOR;
  $banned_ip = 'ip_dos'.DIRECTORY_SEPARATOR.'banned'.DIRECTORY_SEPARATOR;
  $ip_max_visit = 60;
  $ip_time = 15;
  $ip_penalty = 600;
  
  $sess_max_visit = 30;
  $sess_time = 15;
  $sess_penalty = 30;
  $time = time();
  $check_dos = TRUE;
  // nếu không trong danh sách cho phép truy cập không giới hạn thì mới kiểm tra
  $ip = ip_address();
  if($check_dos && ! file_exists($allowed_ip.$ip))
  {
		if(file_exists($banned_ip.$ip))
		{
			if(filemtime($banned_ip.$ip) + $ip_penalty > $time)
			{
				header("HTTP/1.0 503 Service Temporality Unavailable");
				header("Connection: close");
				header("Content-Type: text/html");
				echo "<html><body><h1>503 Service Temporality Unavailable</h1><h2>Wait 10 minutes and try agian...</h2></doby></html>";
				die();
			}
			else
			{
				unlink($banned_ip.$ip);
			}
		}	
  }
  
  // kết nối 
  $sever="localhost";
  $user="";
  $password="";      
  $conn=mysql_connect($sever,$user,$password,TRUE);
  mysql_query("SET NAMES 'utf8'",$conn);
  mysql_select_db("ckv",$conn);
  
  // kiểm tra số lần request của 1 IP để đưa vào danh sách banned
  $sql = "select count(ip) from dos_ip where ip ='" . $ip . "' and requested_on > $time-15";
  $no_req = @mysql_result(@mysql_query($sql,$conn), 0);
  if($no_req == $ip_max_visit-1)
  		touch($banned_ip.$ip);
  @mysql_query("insert into dos_ip(ip, requested_on, request_uri) values('$ip', $time,'".$_SERVER['REQUEST_URI']."')");	
  @mysql_query("delete from dos_ip where ip ='".$ip."' and requested_on < $time - 600");
  
  // kiểm tra số lần request của seesion
  $PHPSESSID = isset($_COOKIE['PHPSESSID']) ? $_COOKIE['PHPSESSID'] : "";
  if($PHPSESSID != '')
  {
	  $sql = "select count(session_id) from dos_session where session_id='".$PHPSESSID."' and requested_on > $time-15";
	  $no_req = @mysql_result(@mysql_query($sql,$conn), 0);
	  if($no_req == $sess_max_visit - 1)
	  {
		 	header("HTTP/1.0 503 Service Temporality Unavailable");
			header("Connection: close");
			header("Content-Type: text/html");
			echo "<html><body><h1>503 Service Temporality Unavailable</h1><h2>Wait 30 seconds and try again...</h2></body></html>";
			die();
	  }
	  @mysql_query("insert into dos_session('session_id','requested_on') values ('$PHPSESSID','$time')");
	  @mysql_query("delete from dos_session where session_id ='".$PHPSESSID."' and requested_on < $time - 60");
  }
  /**
  * get ip address
  * 
  */
  function ip_address()
  {
		if($_SERVER['REMOTE_ADDR'] && isset($_SERVER['HTTP_CLIENT_IP'])) 
		{
		 	return $_SERVER['HTTP_CLIENT_IP'];
		}elseif($_SERVER['REMOTE_ADDR'])
		{
		 	return $_SERVER['REMOTE_ADDR'];
		}
		elseif($_SERVER['HTTP_CLIENT_IP'])
		{
		 	return $_SERVER['HTTP_CLIENT_IP'];
		}elseif($_SERVER['HTTP_X_FORWARDED_FOR'])
		{
		 	return $_SERVER['HTTP_X_FORWARDED_FOR'];
		}	 
  }  
?>
